#include <QtWidgets>
#include <QDebug>
#include "cg_cartejoueur.h"
#include "cg_jeujoueur.h"
#include "cg_autre.h"

Cg_CarteJoueur::Cg_CarteJoueur() : QGraphicsPixmapItem(), m_place(0), m_jeu(0), m_numero(qrand() % 78), m_chemin(creerChemin(m_numero)), m_jouable(false), m_chienEnCours(false)
{
    QPixmap carteJoueur;
    carteJoueur.load(m_chemin);
    setPixmap(carteJoueur);
    setAcceptHoverEvents(true);
    setCursor(Qt::OpenHandCursor);
    setTransformationMode(Qt::SmoothTransformation);
    setAcceptedMouseButtons(Qt::LeftButton);
    setFlag(QGraphicsItem::ItemIsSelectable);
    setFlag(QGraphicsItem::ItemIsMovable);
    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
}

Cg_CarteJoueur::Cg_CarteJoueur(unsigned int numero) : QGraphicsPixmapItem(), m_place(0), m_jeu(0), m_numero(numero), m_chemin(creerChemin(m_numero)), m_jouable(false), m_chienEnCours(false)
{
    QPixmap carteJoueur;
    carteJoueur.load(m_chemin);
    setPixmap(carteJoueur);
    setAcceptHoverEvents(true);
    setCursor(Qt::OpenHandCursor);
    setTransformationMode(Qt::SmoothTransformation);
    setAcceptedMouseButtons(Qt::LeftButton);
    setFlag(QGraphicsItem::ItemIsSelectable);
    setFlag(QGraphicsItem::ItemIsMovable);
    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
}

Cg_CarteJoueur::Cg_CarteJoueur(unsigned int numero, Cg_JeuJoueur *jeu) : QGraphicsPixmapItem(), m_place(0), m_jeu(jeu), m_numero(numero), m_chemin(creerChemin(m_numero)), m_jouable(false), m_chienEnCours(false)
{
    jeu->ajouterCarte(this,false);
    setZValue(m_place);
    QPixmap carteJoueur;
    carteJoueur.load(m_chemin);
    setPixmap(carteJoueur);
    setAcceptHoverEvents(true);
    setTransformationMode(Qt::SmoothTransformation);
    setCursor(Qt::OpenHandCursor);
    setAcceptedMouseButtons(Qt::LeftButton);
    setFlag(QGraphicsItem::ItemIsSelectable);
    setFlag(QGraphicsItem::ItemIsMovable);
    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
}

Cg_CarteJoueur::Cg_CarteJoueur(unsigned int numero, Cg_JeuJoueur *jeu, int place) : QGraphicsPixmapItem(), m_place(place), m_jeu(jeu), m_numero(numero), m_chemin(creerChemin(m_numero)), m_jouable(false), m_chienEnCours(false)
{
    jeu->ajouterCarte(this,false);
    setZValue(m_place);
    QPixmap carteJoueur;
    carteJoueur.load(m_chemin);
    setPixmap(carteJoueur);
    setAcceptHoverEvents(true);
    setTransformationMode(Qt::SmoothTransformation);
    setCursor(Qt::OpenHandCursor);
    setAcceptedMouseButtons(Qt::LeftButton);
    setFlag(QGraphicsItem::ItemIsSelectable);
    setFlag(QGraphicsItem::ItemIsMovable);
    setFlag(QGraphicsItem::ItemSendsGeometryChanges);
}

unsigned int Cg_CarteJoueur::getNumero()
{
    return m_numero;
}

QString Cg_CarteJoueur::getChemin()
{
    return m_chemin;
}

void Cg_CarteJoueur::setJouable()
{
    m_jouable = true;
}

void Cg_CarteJoueur::setPlace(int place)
{
    m_place = place;
}

void Cg_CarteJoueur::setJeu(Cg_JeuJoueur *jeu)
{
    m_jeu = jeu;
}

int Cg_CarteJoueur::getPlace()
{
    return m_place;
}

Cg_JeuJoueur* Cg_CarteJoueur::getJeu()
{
    return m_jeu;
}

void Cg_CarteJoueur::mousePressEvent(QGraphicsSceneMouseEvent *)
{
    setCursor(Qt::ClosedHandCursor);
}

void Cg_CarteJoueur::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if (QLineF(event->screenPos(), event->buttonDownScreenPos(Qt::LeftButton))
        .length() < QApplication::startDragDistance())
    {
        return;
    }
    if (m_jouable)
    {
        QDrag *drag = new QDrag(event->widget());
        QMimeData *mime = new QMimeData;
        drag->setMimeData(mime);

        QImage image(m_chemin);
        mime->setImageData(image);

        drag->setPixmap(QPixmap::fromImage(image));
        drag->setHotSpot(QPoint(75, 125));
        QPixmap rien;
        QPixmap carteJoueur = pixmap();
        this->setPixmap(rien);
        m_jeu->retirerCarte(this);
        m_jeu->update();
        qDebug() << "Drag&Drop - Cg_CarteJoueur\n";

        if (drag->exec(Qt::MoveAction | Qt::MoveAction) != Qt::MoveAction)
        {
           this->setPixmap(carteJoueur);
           m_jeu->ajouterCarte(this,false);
           m_jeu->update();
        }
        else
        {
            if (m_chienEnCours)
            {
                qDebug() << "CarteAuChien - Cg_CarteJoueur\n";
                emit carteAuChien(Carte(m_numero));
            }
            else
            {
                qDebug() << "formuler_requete - Cg_CarteJoueur\n";
                emit formuler_requete(Carte(m_numero));
            }
            m_jouable = false;
        }
        setCursor(Qt::OpenHandCursor);
    }
}

void Cg_CarteJoueur::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
{
    setCursor(Qt::OpenHandCursor);
}

void Cg_CarteJoueur::hoverEnterEvent(QGraphicsSceneHoverEvent *)
{
    this->setZValue(15);
    update();
}

void Cg_CarteJoueur::hoverLeaveEvent(QGraphicsSceneHoverEvent *)
{
    this->setZValue(m_place);
    update();
}

void Cg_CarteJoueur::doit_jouer()
{
    m_jouable = true;
}

void Cg_CarteJoueur::doit_ecarter(std::vector<Carte> possibles, std::vector<Carte> atouts)
{
    Q_UNUSED(atouts)
    unsigned int i = 0;
    for (i = 0 ; i < possibles.size() ; i++)
    {
        if ((possibles[i]).numero() == m_numero)
        {
            m_jouable = true;
        }
    }
    m_chienEnCours = true;
}
